package day19;

import org.omg.CORBA.PUBLIC_MEMBER;

//测试volatile是否可以保证可见性
public class Demo3 {
    public static void main(String[] args) {
        new My1().start();
        new My2().start();
        //主线程：线程访问共享变量的位置，比如：money
        //线程工作内容：每个线程都会 有一个独立内存空间，来控制自己线程执行逻辑
        //为什么没有跳出循环：当变量没有被volatile修饰
        //从My1线程先开始，先把主内存保存的money变量，读取到自己工作内存
        //My2线程后开始，睡醒后去修改变量的值，先把自己工作内存的money变量修改了
        //再去同步到主内存中去
        //My1线程由于不知道对方工作内存的结果，认为它一直是10万

        //如果money变量被volatile修饰后，当my2线程修改完后，主内存的值也会刷新
        //my1的工作内存的变量会让它直接失败，强制刷新主内存保存的money
        //my2修改了，那么my1才能可见
    }
}
class Money{
    //共享数据
    public volatile static int money=100000;
}

class My1 extends Thread{
    public void run() {
        while (Money.money==100000){


        }
        System.out.println("我的存款发生改变了，已经不是10万了");
    }
}

class My2 extends Thread{
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Money.money=50000;
    }
}

